﻿namespace SoftwareConsulting.BI11.NumericalMethods.Statistics
{
    /// <summary>
    /// Класс хранения статистических моментов случайной переменной для фиксированного множества 1го-4го порядков
    /// </summary>
    public class StatisticalMomentsFixed : StatisticalMoments
    {
        /// <summary>
        /// Конструктор класса по умолчанию
        /// </summary>
        public StatisticalMomentsFixed() : 
            base()
        {
        }

        /// <summary>
        /// Быстро сохраняет случайную переменную
        /// </summary>
        /// <param name="x"></param>
        public override void Accumulate(double x)
        {
            double n = Moments[0];
            double n1 = n + 1;
            double n2 = n * n;
            double delta = (Moments[1] - x) / n1;
            double d2 = delta * delta;
            double d3 = delta * d2;
            double r1 = (double)n / (double)n1;
            Moments[4] += 4 * delta * Moments[3] + 6 * d2 * Moments[2]
                                                    + (1 + n * n2) * d2 * d2;
            Moments[4] *= r1;
            Moments[3] += 3 * delta * Moments[2] + (1 - n2) * d3;
            Moments[3] *= r1;
            Moments[2] += (1 + n) * d2;
            Moments[2] *= r1;
            Moments[1] -= delta;
            Moments[0] = n1;
        }
    }
}
